那就接續著昨天的內容,今天提到的也是大家常用的function及slice
go在宣告function的方式如下
func <function名稱> (<引入的變數名稱> <引入的變數類別>) (<回傳變數(選填)> <回傳類別>) {
// 做一些事
}
package main
import "fmt"
func printHelloWorld() {
fmt.Println("Hello World")
}
func printSomeThing(input1 string) {
fmt.Println("output", input1)
}
func addSomething(input string) string {
return input + "!!!"
}
func main() {
printHelloWorld()
printSomeThing("this is output")
var x string
x = addSomething("Good")
fmt.Println(x)
}
但在go的function中,除了引入的變數的可以是0~很多個,輸出也可以0~很多個,範例如下
package main
import "fmt"
func swap(x string, y string) (string, string) {
return y, x
}
func main() {
var a string
var b string
a, b = swap("hello", "world")
fmt.Println(a, b)
}
另外,在go的function中,還有一個特別的用法,可以在回傳的變數那邊先打上預設想要回傳的內容,他就會在function的最一開始幫你宣告好這幾個變數,之後只要在function中打上return即可,當然如果你接下來還是有內容想要回傳,也可以不受這個限制影響,只要型態是一樣的就可以了
package main
import "fmt"
func swap(x string, y string) (output1 string, output2 string) {
output1 = y
output2 = x
if x == "foo" {
return "bar", "bar"
}
return
}
func main() {
var a string
var b string
a, b = swap("hello", "world")
fmt.Println(a, b)
a, b = swap("foo", "world")
fmt.Println(a, b)
}
defer
這是golang的特別功能,主要的功能是當你使用了這個語法,他就會將他後面的內容挪到你的function執行結束後才會執行(順序為由下往上的執行)
func testDefer() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
defer fmt.Println("4")
defer fmt.Println("5")
fmt.Println("Hello")
}
testDefer()
输出结果
Hello
5
4
3
2
1
Slice是golang獨有的資料型態,可以先把它視為可以擴充的array
他的用法如下
// 宣告
var peopleNames []string
var peopleSex []string = []string{"male","female"}
peoplePhoneNumber := []string{"0912345678","0987654321"}
fmt.Println("peopleSex", peopleSex)
fmt.Println("peoplePhoneNumber", peoplePhoneNumber)
// 將資料放到slice
fmt.Println("peopleNames", peopleNames)
peopleNames = append(peopleNames, "Peter")
fmt.Println("peopleNames", peopleNames)
peopleNames = append(peopleNames, "John", "Eric")
// 取得slice有幾個值(length)
fmt.Println("peopleNames len", len(peopleNames))
// 取其中的值
fmt.Println("people name =>", peopleNames[1]) // John
// 對slice裡的值做迴圈操作
for index, name := range peopleNames {
fmt.Println("index", index)
fmt.Println("name", name)
}
// 如果你只需要slice的值,不需要index的話,就可以用_來作替代
for _, name := range peopleNames {
fmt.Println("name", name)
}
在golang中,slice是用數字來代表其中每個object的位置,而map就可以透過其他屬性的內容來找到相對應的object的位置,這個會常常與未來會提到的interface一起使用,來承接json物件的東西
person := make(map[string]string)
person["name"] = "Kevin"
person["address"] = "Taipei"
x := "address"
fmt.Println(person)
fmt.Println(person["name"]) // Kevin
fmt.Println(person[x]) // Taipei